/**
  @file     	DESIGNPATTERN_Bridge.h 
  @brief    	1.When the algorithm to create complex object should be independent of the part of the object, 
                  as well as their assembly;
				2.When construction process must be allowed to construct the object is different;
  @author  	arvin
  @version 	1.0   2012/12/20
 */

#ifndef CXX_DESIGNPATTERN_BRIDGE_H
#define CXX_DESIGNPATTERN_BRIDGE_H
#include "ProductDef.h"

class AbstractBridgeImp;

class AbstractBridge
{
public:
	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~AbstractBridge();

	/**
	* Operation
	*
	* @param VOID
	* @return VOID
	* @note
	*/
	virtual VOID Operation() = 0;

	/**
	* GetComputer
	*
	* @param VOID
	* @return COMPUTER_TYPE
	*/
	COMPUTER_TYPE GetComputer();
protected:
	/**
	* Construction
	*
	* @param COMPUTER_TYPE eComputer
	* @param AbstractBridgeImp* pAbstractBridgeImp
	* @return
	*/
	AbstractBridge(COMPUTER_TYPE eComputer, AbstractBridgeImp* pAbstractBridgeImp);

	/**
	* SetComputer
	*
	* @param COMPUTER_TYPE eComputer
	* @return
	*/
	VOID SetComputer(COMPUTER_TYPE eComputer);
private:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	AbstractBridge();

	/**
	* Copy Construction
	*
	* @param const AbstractBridge& cBridge
	* @return
	*/
	AbstractBridge(const AbstractBridge& cBridge);

public:
protected:
private:
	COMPUTER_TYPE m_eComputer;
	AbstractBridgeImp* m_pAbstractBridgeImp;
};

class NotebookBridge : public AbstractBridge
{
public:
	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~NotebookBridge();

	/**
	* Operation
	*
	* @param VOID
	* @return VOID
	* @note
	*/
	virtual VOID Operation();

	/**
	* Construction
	*
	* @param AbstractBridgeImp* pAbstractBridgeImp
	* @return
	*/
	NotebookBridge(AbstractBridgeImp* pAbstractBridgeImp);
protected:
private:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	NotebookBridge();

	/**
	* Copy Construction
	*
	* @param const NotebookBridge& cNotebookBridge
	* @return
	*/
	NotebookBridge(const NotebookBridge& cNotebookBridge);

public:
protected:
private:
};

class DesktopBridge : public AbstractBridge
{
public:
	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~DesktopBridge();

	/**
	* Operation
	*
	* @param VOID
	* @return VOID
	* @note
	*/
	virtual VOID Operation();

	/**
	* Construction
	*
	* @param AbstractBridgeImp* pAbstractBridgeImp
	* @return
	*/
	DesktopBridge(AbstractBridgeImp* pAbstractBridgeImp);
protected:
private:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	DesktopBridge();

	/**
	* Copy Construction
	*
	* @param const DesktopBridge& cDesktopBridge
	* @return
	*/
	DesktopBridge(const DesktopBridge& cDesktopBridge);

public:
protected:
private:
};

class ServerBridge : public AbstractBridge
{
public:
	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~ServerBridge();

	/**
	* Operation
	*
	* @param VOID
	* @return VOID
	* @note
	*/
	virtual VOID Operation();

	/**
	* Construction
	*
	* @param AbstractBridgeImp* pAbstractBridgeImp
	* @return
	*/
	ServerBridge(AbstractBridgeImp* pAbstractBridgeImp);
protected:
private:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	ServerBridge();

	/**
	* Copy Construction
	*
	* @param const ServerBridge& cServerBridge
	* @return
	*/
	ServerBridge(const ServerBridge& cServerBridge);

public:
protected:
private:
};


#endif	/* >>CXX_DESIGNPATTERN_BRIDGE_H<< */
/* EOF */